﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;


namespace BazingaProtokol
{
    /// <summary>
    /// Klasa koja predstavlje poruke kojima komuniciraju klijent i posluzitelj.
    /// </summary>
    [Serializable]
    public class Poruka
    {
        /// <summary>
        /// Svojstvo koje opisuje tip poruke.
        /// </summary>
        public Tip TipPoruke { get; set; }

        /// <summary>
        /// Prazni, pretpostavljeni konstruktor.
        /// </summary>
        public Poruka() { }

        /// <summary>
        /// Konstruktor koji postavlja tip poruke.
        /// </summary>
        /// <param name="tipPoruke">Tip poruke</param>
        public Poruka(Tip tipPoruke)
        {
            this.TipPoruke = tipPoruke;
        }

    }
    
    /// <summary>
    /// Klasa koja predstavlja poruke koje osim zaglavlja imaju i podatke.
    /// <example>
    /// Primjer pokazuje stvaranje poruke.
    /// <code lang="cs">
    /// JednostavnaPoruka pitanje = new JednostavnaPoruka(Tip.PitanjeLozinka, new object[] { OIB });
    /// </code>
    /// </example>
    /// </summary>
    [Serializable]
    public class JednostavnaPoruka : Poruka
    {
        
        /// <summary>
        /// Podaci su predstavljeni poljem objekata.
        /// </summary>
        public object[] Podaci { get; set; }

        /// <summary>
        /// Prazni, pretpostavljeni konstruktor.
        /// </summary>
        public JednostavnaPoruka() { }

        /// <summary>
        /// Konstruktor koji postavlja tip poruke i podatke.
        /// </summary>
        /// <param name="tipPoruke">Tip poruke</param>
        /// <param name="podaci">Podaci</param>
        public JednostavnaPoruka(Tip tipPoruke, object[] podaci) : base(tipPoruke)
        {
            this.Podaci = podaci;
        }
    }

    /// <summary>
    /// Klasa koja predstavlja poruke kojima se prenose izborne liste.
    /// </summary>
    [Serializable]
    public class PorukaListe : Poruka
    {
        /// <summary>
        /// Svojstvo u kojem su sadrzane izborne liste.
        /// </summary>
        public List<IzbornaLista> PopisIzbornihLista { get; set; }

        /// <summary>
        /// Prazni, pretpostavljeni konstruktor.
        /// </summary>
        public PorukaListe() { }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="tipPoruke"></param>
        /// <param name="popisIzbornihLista"></param>
        public PorukaListe(Tip tipPoruke, List<IzbornaLista> popisIzbornihLista)
            : base(tipPoruke)
        {
            this.PopisIzbornihLista = popisIzbornihLista;
        }
    }

    /// <summary>
    /// Klasa koja predstavlja izborne jedinice.
    /// </summary>
    [Serializable]
    public class IzbornaJedinica
    {
        /// <summary>
        /// Identifikatorsko svojstvo (redni broj izborne jedinice).
        /// </summary>
        public int ID { get; set; }

        /// <summary>
        /// Svojstvo naziva izborne jedinice.
        /// </summary>
        public string Naziv { get; set; }
    }

    /// <summary>
    /// Klasa koja predstavlja izborne liste.
    /// </summary>
    [Serializable]
    public class IzbornaLista
    {
        /// <summary>
        /// Redni broj izborne liste.
        /// </summary>
        public int RedniBroj { get; set; }

        /// <summary>
        /// Naziv izborne liste.
        /// </summary>
        public string Naziv { get; set; }

        /// <summary>
        /// Lista identifikatora stranaka koje se nalaze u izbornoj listi.
        /// </summary>
        public List<int> PopisIDStranaka { get; set; }

        /// <summary>
        /// Broj glasova koje je izborna lista osvojila.
        /// </summary>
        public int BrojGlasova { get; set; }
    }

    /// <summary>
    /// Klasa koja predstavlja stranke.
    /// </summary>
    [Serializable]
    public class Stranka
    {
        public int ID { get; set; }
        public string Naziv { get; set; }
        public string Kratica { get; set; }
    }

    /// <summary>
    /// Enumeracija koja sadrzi sve tipove poruka koji se koriste u komunikaciji.
    /// </summary>
    [Serializable]
    public enum Tip
    {
        PitanjePozdrav,
        OdgovorPozdrav,
        PitanjeLozinka,
        OdgovorLozinka,
        PitanjeIzborneJedinice,
        OdgovorIzborneJedinice,
        PitanjeStranke,
        OdgovorStranke,
        PitanjeDohvatiListe,
        OdgovorDohvatiListe,
        PitanjeStvoriListu,
        OdgovorStvoriListu,
        PitanjeIzmijeniListu,
        OdgovorIzmijeniListu,
        PitanjeObrisiListu,
        OdgovorObrisiListu,
        PitanjeOmoguciGlasovanje,
        OdgovorOmoguciGlasovanje,
        PitanjeOnemoguciGlasovanje,
        PitanjeLozinkaBirac,
        OdgovorLozinkaBirac,
        PitanjeListeBirac,
        OdgovorListeBirac,
        PitanjeOdabirBirac,
        OdgovorOdabirBirac,
        OdgovorOnemoguciGlasovanje,
        PitanjeStatusGlasovanja,
        OdgovorStatusGlasovanja,
        PitanjeRezultat,
        OdgovorRezultat,
        PitanjeKraj,
        OdgovorKraj,
        Pogreska
    }
}
